package ar.com.larreta.colegio.client.pagos;

import java.util.ArrayList;
import java.util.Iterator;
import java.util.Map;

import ar.com.larreta.colegio.client.Colegio;
import ar.com.larreta.colegio.intercambio.client.Alumno;
import ar.com.larreta.colegio.intercambio.client.ListaDeDeudasPorAlumno;
import ar.com.larreta.colegio.intercambio.client.Obligacion;
import ar.com.larreta.colegio.intercambio.client.Pago;
import ar.com.larreta.colegio.intercambio.client.Responsable;
import ar.com.larreta.controlador.client.Invocador;
import ar.com.larreta.grilla.client.Grilla;
import ar.com.larreta.grilla.client.ventanas.VentanaConGrilla;
import ar.com.larreta.intercambio.client.ArchivoGenerado;
import ar.com.larreta.intercambio.client.Respuesta;
import ar.com.larreta.vista.client.BarraHerramientas;
import ar.com.larreta.vista.client.CamposConst;
import ar.com.larreta.vista.client.DialogInfo;
import ar.com.larreta.vista.client.Mensajes;
import ar.com.larreta.vista.client.RetornoDeLlamadaConVentana;

import com.extjs.gxt.ui.client.event.MenuEvent;
import com.extjs.gxt.ui.client.event.SelectionListener;
import com.extjs.gxt.ui.client.widget.VerticalPanel;
import com.extjs.gxt.ui.client.widget.Window;
import com.extjs.gxt.ui.client.widget.grid.ColumnConfig;
import com.extjs.gxt.ui.client.widget.grid.ColumnModel;
import com.extjs.gxt.ui.client.widget.menu.Menu;
import com.extjs.gxt.ui.client.widget.menu.MenuItem;
import com.google.gwt.i18n.client.DateTimeFormat;

public class VentanaSeleccionDeDeudas extends VentanaConGrilla {

	public static final Integer ANCHO_VENTANA = 400;
	public static final Integer ANCHO_IZQUIERDA = 350;
	public static final Integer ANCHO_CENTRO = 400;
	public static final Integer ANCHO_DERECHA = 350;
	public static final Integer LARGO_VENTANA = 320;
	
	public static final Integer LARGO_DATOS = 280;
	public static final Integer LARGO_INFO = 245;
	
	public static final Integer LARGO_GRILLA = 230; 
	public static final Integer TAMANIO_TEXTO_MENSAJE = 200;
	
	public static final String LISTA = "listaDeudas";
	
	public static final String ARCHIVO_GENERADO = "archivoGenerado";
	
	private Alumno alumno;
	private Responsable responsable;
	
	private MenuItem pagar;

	public VentanaSeleccionDeDeudas(Alumno alumno, Responsable responsable) {
		super(Mensajes.getInstancia().get("msg.colegio.selecciondeudas.titulo") + alumno.getNombreCompleto(), null);

		this.alumno = alumno;
		this.responsable = responsable;
		this.setSize(ANCHO_VENTANA, LARGO_VENTANA);
		
		VerticalPanel barraYCampos = new VerticalPanel();
		add(barraYCampos);
		barraYCampos.setSize(ANCHO_VENTANA, 30);
		
		barraHerramientas = new BarraHerramientas(this, ANCHO_VENTANA, 25);
		barraYCampos.add(barraHerramientas);
		
		grilla = new Grilla(new ListaDeDeudasPorAlumno(alumno), getConfiguracionColumnas(), LISTA);
		grilla.setSize(ANCHO_VENTANA - 15, LARGO_GRILLA);
		
		add(grilla);
		add(grilla.getToolBar());
		
		final Alumno alumnoSeleccionado = alumno;
		final Responsable responsableSeleccionado = responsable;
		
		grilla.setContextMenu(new Menu());
		pagar = new MenuItem(Mensajes.getInstancia().get("msg.colegio.verdeudas"), new SelectionListener<MenuEvent>() {
			@Override
			public void componentSelected(MenuEvent ce) {
				if ((getGrilla().getSelectionModel().getSelectedItems()!=null) &&
						(getGrilla().getSelectionModel().getSelectedItems().size()>0)){
					
					Iterator<Obligacion> obligaciones = getGrilla().getSelectionModel().getSelectedItems().iterator();
					 
					while (obligaciones.hasNext()) {
						Obligacion obligacion = (Obligacion) obligaciones.next();
						Pago pago = new Pago();
						pago.setValor(obligacion.getValor());
						//pago.setObligacion(obligacion);
						pago.setAlumno(alumnoSeleccionado);
						pago.setResponsable(responsableSeleccionado);
						Invocador.invocar(pago, new RetornoDeLlamadaConVentana() {
							
							@Override
							public void procesado(Map<Object, Respuesta> respuestas) {
								ArchivoGenerado generado = (ArchivoGenerado) respuestas.get(ARCHIVO_GENERADO);
								
								Window window = new Window();
								window.setSize(500, 700);
								window.setUrl("/colegio/descargarArchivo?generado=" + generado.getClaveUnica());
								window.show();
								
								//Window.open("/colegio/descargarArchivo?generado=" + generado.getClaveUnica(), generado.getClaveUnica(),"");
								
							}
						});
					}
				} else {
					DialogInfo.mostrar("Omitio Seleccion", "Debe seleccionar al menos una obligacion a pagar.");
				}				
			}
		});
		grilla.getContextMenu().add(pagar);
	
		show();
	}
	
	public VentanaSeleccionDeDeudas getVentana(){
		return this;
	}
	
	
	public void confirmando(){
		if (esValido()) {
			
			if ((getGrilla().getSelectionModel().getSelectedItems()!=null) &&
					(getGrilla().getSelectionModel().getSelectedItems().size()>0)){
				
				Iterator<Obligacion> obligaciones = getGrilla().getSelectionModel().getSelectedItems().iterator();
				
				while (obligaciones.hasNext()) {
					Obligacion obligacion = (Obligacion) obligaciones.next();
					Pago pago = new Pago();
					pago.setValor(obligacion.getValor());
					//pago.setObligacion(obligacion);
					pago.setAlumno(alumno);
					pago.setResponsable(responsable);
					Colegio.getGrilla().agregarDato(pago);
				}
				
				Colegio.getGrilla().load();
				this.hide();
			} else {
				DialogInfo.mostrar("Omitio Seleccion", "Debe seleccionar al menos una obligacion a pagar.");
			}

		}
	}
	
	private ColumnModel getConfiguracionColumnas() {
		ColumnConfig columnNombre = new ColumnConfig(CamposConst.NOMBRE, Mensajes.getInstancia().get("msg.colegio.obligaciones.nombre"), 125);
		ColumnConfig columnApellido = new ColumnConfig(CamposConst.VALOR, Mensajes.getInstancia().get("msg.colegio.obligaciones.valor"), 125);
		ColumnConfig columnVencimiento = new ColumnConfig(CamposConst.VENCIMIENTO, Mensajes.getInstancia().get("msg.colegio.obligaciones.vencimiento"), 125);
		columnVencimiento.setDateTimeFormat(DateTimeFormat.getFormat("dd/MM/yyyy"));
		
		ArrayList<ColumnConfig> columnConfigs = new ArrayList<ColumnConfig>();
		columnConfigs.add(columnNombre);
		columnConfigs.add(columnApellido);
		columnConfigs.add(columnVencimiento);
		
		return new ColumnModel(columnConfigs);
	}
	
	@Override
	public void limpiar() {
		super.limpiar();
	}

	public Grilla getGrilla() {
		return grilla;
	}

	@Override
	public void cancelando() {
		super.cancelando();
		this.hide();
	}
	
}
